# -*- coding: utf-8 -*-
"""
同义词库管理控制器
提供同义词库数据的上传、查询、重置等功能
支持JSON文件格式的同义词库管理
"""
import json
from typing import Dict, Any

from loguru import logger
from fastapi import File, UploadFile, Request, Form
from pydantic import BaseModel

from configs import QUERY_TRANS_DATA_FILE, USER_QUERY_TRANS_DATA_FILE
from schemas.response_entity import JsonModel


# ==================== 数据模型定义 ====================

class ThesaurusUploadEntity(BaseModel):
    """同义词库上传实体"""
    token: str  # 用户认证token


# ==================== 工具函数 ====================

def load_data() -> Dict[str, Any]:
    """从文件加载数据，如果文件不存在则使用默认数据"""
    try:
        with open(USER_QUERY_TRANS_DATA_FILE, "r", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        with open(QUERY_TRANS_DATA_FILE, "r", encoding="utf-8") as f:
            return json.load(f)


def save_data(data: Dict[str, Any]):
    """将数据保存到文件"""
    with open(USER_QUERY_TRANS_DATA_FILE, "w", encoding="utf-8") as f:
        json_data = json.dumps(data, ensure_ascii=False, indent=4)
        f.write(json_data)


def get_default_data() -> Dict[str, Any]:
    """获取默认数据"""
    with open(QUERY_TRANS_DATA_FILE, "r", encoding="utf-8") as f:
        return json.load(f)


def get_current_data() -> Dict[str, Any]:
    """获取当前数据"""
    return load_data()


# ==================== API接口函数 ====================

# 上传JSON文件并替换当前数据
async def upload_json_file(request: Request, file: UploadFile = File(...), token: str = Form(...)):
    """
    上传JSON文件并替换当前同义词库数据
    
    Args:
        request: FastAPI请求对象
        file: 上传的JSON文件
        token: 用户认证token
        
    Returns:
        JsonModel: 上传结果响应
        
    功能说明:
        - 只有管理员可以上传同义词库文件
        - 支持JSON格式的同义词库文件
        - 上传成功后立即替换当前数据
    """
    user = request.state.user
    if user is None:
        return JsonModel(code=401, data=None, msg="用户token 非法").to_response()
    
    try:
        # 检查用户权限
        if not user.check_admin_role():
            return JsonModel(code=403, data=None, msg="用户无权限").to_response()

        # 检查文件格式
        if not file.filename.endswith(".json"):
            return JsonModel(code=400, data=None, msg="文件格式必须是JSON").to_response()

        # 读取并解析文件内容
        content = await file.read()
        new_data = json.loads(content)
        
        # 保存数据到文件
        save_data(new_data)
        
        logger.info(f"用户 {user.username} 上传了同义词库文件: {file.filename}")
        return JsonModel(code=200, data=None, msg="文件上传成功，数据已更新").to_response()
        
    except json.JSONDecodeError:
        logger.error(f"用户 {user.username} 上传的文件不是有效的JSON格式")
        return JsonModel(code=400, data=None, msg="文件内容不是有效的JSON").to_response()
    except Exception as e:
        logger.error(f"上传同义词库文件失败: {str(e)}")
        return JsonModel(code=500, data=None, msg="服务器内部错误").to_response()


# 获取当前JSON数据
async def get_json_data(request: Request, token: str):
    """
    获取当前同义词库数据
    
    Args:
        request: FastAPI请求对象
        token: 用户认证token
        
    Returns:
        JsonModel: 同义词库数据响应
        
    功能说明:
        - 只有管理员可以查看同义词库数据
        - 返回当前生效的同义词库数据
    """
    user = request.state.user
    if user is None:
        return JsonModel(code=401, data=None, msg="用户token 非法").to_response()
    
    try:
        # 检查用户权限
        if not user.check_admin_role():
            return JsonModel(code=403, data=None, msg="用户无权限").to_response()

        # 获取当前数据
        current_data = get_current_data()
        
        return JsonModel(code=200, data=current_data, msg="success").to_response()
        
    except Exception as e:
        logger.error(f"获取同义词库数据失败: {str(e)}")
        return JsonModel(code=500, data=None, msg="服务器内部错误").to_response()


# 恢复默认数据
async def reset_to_default(request: Request, token: str):
    """
    恢复同义词库为默认数据
    
    Args:
        request: FastAPI请求对象
        token: 用户认证token
        
    Returns:
        JsonModel: 重置结果响应
        
    功能说明:
        - 只有管理员可以重置同义词库
        - 将当前数据恢复为系统默认数据
        - 操作不可逆，请谨慎使用
    """
    user = request.state.user
    if user is None:
        return JsonModel(code=401, data=None, msg="用户token 非法").to_response()
    
    try:
        # 检查用户权限
        if not user.check_admin_role():
            return JsonModel(code=403, data=None, msg="用户无权限").to_response()

        # 获取默认数据并保存
        default_data = get_default_data()
        save_data(default_data)
        
        logger.info(f"用户 {user.username} 重置了同义词库为默认数据")
        return JsonModel(code=200, data=default_data, msg="数据已恢复为默认值").to_response()
        
    except Exception as e:
        logger.error(f"重置同义词库失败: {str(e)}")
        return JsonModel(code=500, data=None, msg="服务器内部错误").to_response()
